package http

import (
	"fmt"
	"net/http"
)

// 定义一个方法的类型，用来实现路由的方法
type Handler func(ctx *Context)
//type Handler func(req *http.Request, res http.ResponseWriter)

// 理解 go中的http的包
// 自定义 handle  http.ListenAndServe(":8000",handle)   实现路由

// 定义结构体实现 Handler 接口
type Server struct {
	// 定义存储路由的map，路由名 =》 实现的方法  实现的方法要能接收http的请求和发送
	route map[string]Handler
}

func NewServer() *Server {
	return &Server{
		route: make(map[string]Handler),
	}
}

// 实现 Handler 的接口
func (s *Server) ServeHTTP(res http.ResponseWriter, req *http.Request) {
	// 自定义的ServerHTTP
	// 自定义处理请求的核心方法
	fmt.Println("我是ServeHTTP")
	ctx := Context{
		Request:  req,
		Response: res,
		index: -1,
	}
	//ctx.Send([]byte("我是ServeHTTP"))
	//// 通过路由，分发方法
	//s.handler(&ctx)
	ctx.Handlers = append(Middlewares, func(ctx *Context) {
		s.handler(ctx)
	})
	ctx.Next()
}

// 实际运行的方法
func (s *Server) handler(ctx *Context) {
	// 获取路由
	route := ctx.Request.URL.Path
	//fmt.Println(route)
	// 判断路由是否存在
	handler := s.match(route)
	if handler != nil {
		//handler(ctx.Request, ctx.Response)
		handler(ctx)
	} else {
		ctx.Send([]byte(route + "--> 不存在"))
	}
}

// 判断路由是否存在对应的方法，存在则返回
func (s *Server) match(route string) Handler {
	handler, ok := s.route[route]
	if ok {
		return handler
	}
	return nil
}

// 添加路由的接口
func (s *Server) AddRoute(route string, handler Handler) {
	s.route[route] = handler
}
